/*
 * 文件名称:          PropertyNameMappingFilter.java
 * 版权所有@ 2016——2017 无锡聆音科技有限公司，保留所有权利
 * 时间:             2016年7月27日 下午9:21:11
 */
package com.lingyin.json.filter;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.serializer.NameFilter;

/**
 *  该过滤器主要是根据需要修改需要转换的对象的属性名。
 *  如对象属性名为testa，不做转换则在转为json字符串的时候，
 *  key为testa，如果根据需要，可以把testa转换为其他值。
 * 
 * @项目        jsonlib
 * 
 * @作者:       关宏新
 * 
 * @日期:       2016年7月27日
 * 
 * @负责人:    关宏新
 * 
 * @负责小组:   聆音项目组
 * 
 */
public class PropertyNameMappingFilter implements NameFilter
{
    //  记录需要转换的映射类及相关属性关系。
    private Map<String, Map<String, String>> maps = new HashMap<String, Map<String, String>>();
    
    /**
     * 
     */
    public PropertyNameMappingFilter()
    {
    }
    
    /**
     * 增加需要转换的属性定义
     * @param clazz 需要转换的class定义
     * @param sourcePropertyName 需要转换的原属性名
     * @param targetPropertyName 需要转换的新属性名
     */
    public PropertyNameMappingFilter(Class<?> clazz, String sourcePropertyName, String targetPropertyName)
    {
        addPropertyMapping(clazz, sourcePropertyName, targetPropertyName);
    }
    
    /**
     * 增加需要转换的属性定义
     * @param clazz 需要转换的class定义
     * @param sourcePropertyName 需要转换的原属性名
     * @param targetPropertyName 需要转换的新属性名
     */
    public PropertyNameMappingFilter(Class<?> clazz, String[] sourcePropertyName, String[] targetPropertyName)
    {
        addPropertyMapping(clazz, sourcePropertyName, targetPropertyName);
    }
    
    /**
     * 增加需要转换的属性定义
     * @param clazz 需要转换的class定义
     * @param sourcePropertyName 需要转换的原属性名
     * @param targetPropertyName 需要转换的新属性名
     * @return 原设置过的属性， 如果原没有设置过值，或clazz为null，则返回为null。
     */
    public String addPropertyMapping(Class<?> clazz, String sourcePropertyName, String targetPropertyName)
    {
        if (clazz == null)
        {
            return null;
        }
        String cn = clazz.getName();
        Map<String, String> temp = maps.get(cn);
        if (temp == null)
        {
            temp = new HashMap<String, String>();
            maps.put(cn, temp);
        }
        return temp.put(sourcePropertyName, targetPropertyName);
    }
    
    /**
     * 增加需要转换的属性定义,注意sourcePropertyName， targetPropertyName的长度必须一致。
     * @param clazz 需要转换的class定义
     * @param sourcePropertyName 需要转换的原属性名集合
     * @param targetPropertyName 需要转换的新属性名集合
     * @return 原设置过的属性， 如果原没有设置过值则返回为内容为null的数组，clazz为null，则返回为null。
     */
    public String[] addPropertyMapping(Class<?> clazz, String[] sourcePropertyName, String[] targetPropertyName)
    {
        if (clazz == null)
        {
            return null;
        }
        String cn = clazz.getName();
        Map<String, String> temp = maps.get(cn);
        if (temp == null)
        {
            temp = new HashMap<String, String>();
            maps.put(cn, temp);
        }
        int length = sourcePropertyName.length;
        String[] ret = new String[length];
        for (int i = 0; i < length; i ++)
        {
            ret[i] = temp.put(sourcePropertyName[i], targetPropertyName[i]);
        }
        return ret;
    }
    
    /**
     * 处理属性名的转换。
     * @param object 需要转换的对象
     * @param name 需要转换的属性名
     * @param value 需要转换的属性值。
     * @return String 为转换后的属性名。
     */
    public String process(Object object, String name, Object value)
    {
        if (name == null || name.length() == 0)
        {
            return name; 
        }
        String clazz = object.getClass().getName();
        Map<String, String> temp = maps.get(clazz);
        if (temp != null)
        {
            String ret = temp.get(name);
            if (ret != null)
            {
                return ret;
            }
        }
        return name;
    }

}
